package com.hjh.core.activity

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.activity.OnBackPressedCallback
import androidx.core.view.MenuHost
import androidx.core.view.MenuProvider
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
import androidx.viewbinding.ViewBinding
import com.dylanc.viewbinding.base.FragmentBinding
import com.dylanc.viewbinding.base.FragmentBindingDelegate
import com.hjh.permission.PermissionUtil

/**
 * @author hjh
 * @version 1.0
 * @since 1.0
 * @date 2024/3/15
 * @qq 3472903821
 * @description Fragment基类
 */
@Suppress("unused")
open class BaseFragment<VB : ViewBinding> : Fragment(),
    FragmentBinding<VB> by FragmentBindingDelegate() {

    private var isTopFragment = false

    @Suppress("MemberVisibilityCanBePrivate")
    var onBackPressedCallback = object : OnBackPressedCallback(!isTopFragment) {
        @Suppress("DEPRECATION")
        override fun handleOnBackPressed() {
            // 处理子 Fragment 的返回逻辑
            // 例如，返回上一层 Fragment
            val navController = findNavController()
            if (!navController.popBackStack()) {
                // 如果没有要回退的 Fragment，执行默认的返回操作
                requireActivity().onBackPressed()
            }
        }
    }

    @Suppress("MemberVisibilityCanBePrivate")
    protected val menuHost: MenuHost by lazy { requireActivity() }

    @Suppress("MemberVisibilityCanBePrivate")
    protected var menuProvider: MenuProvider? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        initParam()
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return createViewWithBinding(inflater, container)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        initView()
        if (!isTopFragment) {
            requireActivity().onBackPressedDispatcher.addCallback(
                viewLifecycleOwner,
                onBackPressedCallback
            )
        }
        initListener()
        initToolbar()
        initViewPager2()
        initRecycleView()
        initData()
        initObserve()
    }

    override fun onResume() {
        super.onResume()
        resetToolbar()
        resetChange()
    }

    /**
     * 初始化 路由参数
     */
    protected open fun initParam() {}

    /**
     * 是否是嵌套导航图中的起始地
     * 调用表明是，不需要注册默认返回事件
     * 如果注册，调用的是 childFragmentManager 中的 NavController，
     * 不能返回父级导航图，而一直返回自己，导致OOM
     */
    protected fun isTopFragment() {
        this.isTopFragment = true
    }

    /**
     * 自定义返回事件
     */
    protected fun initBackListener(onBackPressedCallback: OnBackPressedCallback) {
        this.onBackPressedCallback = onBackPressedCallback
    }

    /**
     * 统一请求权限方法
     *
     * @param storage       是否请求 Android 11+ 的“所有文件访问权限”
     * @param readStorage   是否请求读外部存储权限（Android 6~10）
     * @param writeStorage  是否请求写外部存储权限（Android 6~10）
     * @param location      是否请求精确位置权限
     * @param backgroundLocation 是否请求后台位置权限（Android 10+）
     * @param camera        是否请求相机权限
     * @param audio         是否请求录音权限
     * @param phoneState    是否请求读取设备状态权限
     * @param phoneNumbers  是否请求读取电话号码权限
     * @param readContacts  是否请求读取联系人权限
     * @param writeContacts 是否请求写联系人权限
     * @param sendSms       是否请求发送短信权限
     * @param receiveSms    是否请求接收短信权限
     * @param readSms       是否请求读取短信权限
     * @param readCalendar  是否请求读取日历权限
     * @param writeCalendar 是否请求写日历权限
     * @param bodySensors   是否请求访问身体传感器权限
     * @param bluetoothScan 是否请求蓝牙扫描权限（Android 12+）
     * @param bluetoothConnect 是否请求蓝牙连接权限（Android 12+）
     * @param postNotifications 是否请求发送通知权限（Android 13+）
     * @param onGranted     所有权限被授予时的回调
     * @param onDenied      部分或全部权限被拒绝时的回调，带有被拒权限列表
     */
    fun requestPermission(
        storage: Boolean = false,
        readStorage: Boolean = false,
        writeStorage: Boolean = false,
        location: Boolean = false,
        backgroundLocation: Boolean = false,
        camera: Boolean = false,
        audio: Boolean = false,
        phoneState: Boolean = false,
        phoneNumbers: Boolean = false,
        readContacts: Boolean = false,
        writeContacts: Boolean = false,
        sendSms: Boolean = false,
        receiveSms: Boolean = false,
        readSms: Boolean = false,
        readCalendar: Boolean = false,
        writeCalendar: Boolean = false,
        bodySensors: Boolean = false,
        bluetoothScan: Boolean = false,
        bluetoothConnect: Boolean = false,
        postNotifications: Boolean = false,
        onGranted: (() -> Unit)? = null,
        onDenied: ((denied: MutableList<String>) -> Unit)? = null
    ) {
        PermissionUtil.request(
            requireContext(),
            storage,
            readStorage,
            writeStorage,
            location,
            backgroundLocation,
            camera,
            audio,
            phoneState,
            phoneNumbers,
            readContacts,
            writeContacts,
            sendSms,
            receiveSms,
            readSms,
            readCalendar,
            writeCalendar,
            bodySensors,
            bluetoothScan,
            bluetoothConnect,
            postNotifications,
            onGranted,
            onDenied
        )
    }

    /**
     * 初始化 View
     */
    protected open fun initView() {}

    /**
     * 初始化 事件
     */
    protected open fun initListener() {}

    /**
     * 初始化 工具栏
     */
    protected open fun initToolbar() {}

    /**
     * 初始化 ViewPager2
     */
    protected open fun initViewPager2() {}

    /**
     * 初始化 RecycleView
     */
    protected open fun initRecycleView() {}

    /**
     * 初始化 数据 （网络请求，数据库）
     */
    protected open fun initData() {}

    /**
     * 初始化 数据监听
     */
    protected open fun initObserve() {}

    /**
     * 重置（onResume）
     */
    protected open fun resetChange() {}

    /**
     * 重置工具栏（onResume）
     */
    protected open fun resetToolbar() {}

    /**
     * 释放资源
     */
    protected open fun release() {}

    override fun onDestroyView() {
        release()
        menuProvider?.let {
            menuHost.removeMenuProvider(it)
            menuProvider = null
        }
        super.onDestroyView()
    }
}
